#include "maxnav.h"

MaXNav::MaXNav(QWidget *parent) : QMainWindow(parent)
{
	this->creerActions();
	this->creerMenus();
	this->creerStateBar();
	this->creerToolBar();

	// Création onglets
	_onglets = new QTabWidget;
	_onglets->setMovable(true);
	_onglets->addTab(creerOngletPageWeb(tr("www.google.com")), tr("Google"));
	QPushButton * boutonNouveau = new QPushButton(QIcon("images/32x32/tab-new-3.png"), "");
	QPushButton * boutonFermerOnglet = new QPushButton(QIcon("images/32x32/window-close.png"), "");
	boutonFermerOnglet->setStyleSheet("width : 6px;");
	_onglets->setCornerWidget(boutonNouveau, Qt::TopRightCorner);
	_onglets->setCornerWidget(boutonFermerOnglet, Qt::TopLeftCorner);
	connect(boutonNouveau, SIGNAL(clicked()), this, SLOT(nouvelOnglet()));
	connect(_onglets, SIGNAL(currentChanged(int)), this, SLOT(changementOnglet(int)));
	connect(boutonFermerOnglet, SIGNAL(clicked()), this, SLOT(fermerOnglet()));
	boutonFermerOnglet->setVisible(false);
	setCentralWidget(_onglets);

	// Définition propriétés de la fenêtre
	setMinimumSize(500, 350);
	setWindowIcon(QIcon("images/32x32/akonadi.png"));
	setWindowTitle(tr("MaXNav"));
}

void MaXNav::creerActions()
{
	actionNouvelOnglet = new QAction(tr("&Nouvel Onglet"), this);
	actionNouvelOnglet->setShortcut(tr("Ctrl+T"));
	connect(actionNouvelOnglet, SIGNAL(triggered()), this, SLOT(nouvelOnglet()));

	actionFermerOnglet = new QAction(tr("&Fermer l'onglet"), this);
	actionFermerOnglet->setShortcut(tr("Ctrl+W"));
	connect(actionFermerOnglet, SIGNAL(triggered()), this, SLOT(fermerOnglet()));

	actionQuitter = new QAction(tr("&Quitter"), this);
	actionQuitter->setShortcut(tr("Ctrl+Q"));
	connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));

	actionPrecedente = new QAction(QIcon("images/32x32/go-previous-4.png"), tr("&Precedente"), this);
	actionPrecedente->setEnabled(false);
	actionPrecedente->setShortcut(QKeySequence::Back);
	connect(actionPrecedente, SIGNAL(triggered()), this, SLOT(precedente()));

	actionSuivante = new QAction(QIcon("images/32x32/go-next-4.png"), tr("&Suivante"), this);
	actionSuivante->setEnabled(false);
	actionSuivante->setShortcut(QKeySequence::Forward);
	connect(actionSuivante, SIGNAL(triggered()), this, SLOT(suivante()));

	actionStop = new QAction(QIcon("images/32x32/dialog-cancel-3.png"), tr("S&top"), this);
	actionStop->setEnabled(false);
	connect(actionStop, SIGNAL(triggered()), this, SLOT(stop()));

	actionActualiser = new QAction(QIcon("images/32x32/view-refresh-5.png"), tr("&Actualiser"), this);
	actionActualiser->setShortcut(QKeySequence::Refresh);
	actionActualiser->setShortcut(Qt::Key_F5);
	connect(actionActualiser, SIGNAL(triggered()), this, SLOT(actualiser()));

	actionAccueil = new QAction(QIcon("images/32x32/go-home-10.png"), tr("A&ccueil"), this);
	connect(actionAccueil, SIGNAL(triggered()), this, SLOT(accueil()));

	actionGo = new QAction(QIcon("images/32x32/media-playback-start-5.png"), tr("A&ller à"), this);
	connect(actionGo, SIGNAL(triggered()), this, SLOT(chargerPage()));

	actionAPropos = new QAction(tr("&A propos..."), this);
	actionAPropos->setShortcut(QKeySequence::HelpContents);
	connect(actionAPropos, SIGNAL(triggered()), this, SLOT(aPropos()));

	actionChercherPage = new QAction(QIcon("images/16x16/edit-find-4.png"), tr("&Recherche dans la page..."), this);
	actionChercherPage->setShortcut(tr("Ctrl+F"));
	connect(actionChercherPage, SIGNAL(triggered()), this, SLOT(rechercherPage()));
}

void MaXNav::creerMenus()
{
	QMenu * menuFichier = menuBar()->addMenu(tr("&Fichier"));
	menuFichier->addAction(actionNouvelOnglet);
	menuFichier->addAction(actionFermerOnglet);
	menuFichier->addSeparator();
	menuFichier->addAction(actionQuitter);

	QMenu * navigation = menuBar()->addMenu(tr("&Navigation"));
	navigation->addAction(actionPrecedente);
	navigation->addAction(actionSuivante);
	navigation->addAction(actionStop);
	navigation->addAction(actionActualiser);
	navigation->addAction(actionAccueil);

	QMenu * edition = menuBar()->addMenu(tr("&Edition"));
	edition->addAction(actionChercherPage);

	QMenu * aide = menuBar()->addMenu(tr("&Aide"));
	aide->addAction(actionAPropos);
}

void MaXNav::creerToolBar()
{
	_adresse = new QLineEdit;
	connect(_adresse, SIGNAL(returnPressed()), this, SLOT(chargerPage()));

	_recherche = new QLineEdit;
	_recherche->setMaximumWidth(200);
	_recherche->setPlaceholderText("Rechercher...");
	connect(_recherche, SIGNAL(returnPressed()), this, SLOT(chargerRecherche()));
	connect(_recherche, SIGNAL(textChanged(const QString&)), this, SLOT(miseAJourRecherche(const QString&)));

	_clearButton = new QToolButton(_recherche);
	_clearButton->setIcon(QIcon("images/16x16/edit-clear-2.png"));
	_clearButton->setStyleSheet("QToolButton {border : none; padding : 0px;}");
	_clearButton->setVisible(false);
	_clearButton->setCursor(Qt::ArrowCursor);
	connect(_clearButton, SIGNAL(clicked()), this, SLOT(effacerRecherche()));

	QToolBar * toolBarNav = addToolBar(tr("Navigation"));

	toolBarNav->addAction(actionPrecedente);
	toolBarNav->addAction(actionSuivante);
	toolBarNav->addAction(actionActualiser);
	toolBarNav->addAction(actionStop);
	toolBarNav->addAction(actionAccueil);
	toolBarNav->addWidget(_adresse);
	toolBarNav->addAction(actionGo);
	toolBarNav->addWidget(_recherche);

	_recherchePage = new LineSearch();
	_recherchePage->setMaximumWidth(200);
	_recherchePage->setPlaceholderText("Rechercher...");
	connect(_recherchePage, SIGNAL(returnPressed()), this, SLOT(rechercherPage()));
	connect(_recherchePage, SIGNAL(escapeKeyPressed()), this, SLOT(fermerRechercherPage()));
	connect(_recherchePage, SIGNAL(textChanged(const QString&)), this, SLOT(rechercherPage()));

	_respecterCasse = new QCheckBox(tr("Respecter la casse"));

	QPushButton* fermerRechercher = new QPushButton(QIcon("images/16x16/window-close.png"), "");
	fermerRechercher->setMaximumWidth(fermerRechercher->iconSize().width());

	_toolBarCherchePage = new QToolBar(tr("Recherche"));
	_toolBarCherchePage->setMovable(false);
	_toolBarCherchePage->addWidget(fermerRechercher);
	_toolBarCherchePage->addWidget(_recherchePage);
	_toolBarCherchePage->addAction(actionChercherPage);
	_toolBarCherchePage->addWidget(_respecterCasse);

	_toolBarCherchePage->setMaximumHeight(_recherchePage->sizeHint().height());
	_toolBarCherchePage->setIconSize(QSize(17, 17));
	addToolBar(Qt::BottomToolBarArea, _toolBarCherchePage);
	_toolBarCherchePage->setVisible(false);
	connect(fermerRechercher, SIGNAL(clicked()), this, SLOT(fermerRechercherPage()));
}

void MaXNav::creerStateBar()
{
	_progression = new QProgressBar(this);
	_progression->setVisible(false);
	_progression->setMaximumHeight(14);
	_progression->setMaximumWidth(110);
	_progression->setTextVisible(false);
	statusBar()->addPermanentWidget(_progression, 1);
	statusBar()->setStyleSheet("QStatusBar { padding-right : 20px; padding-left : 5px; }");
}

QWidget* MaXNav::creerOngletPageWeb(QString url)
{
	QWidget* pageOnglet = new QWidget;
	QWebView* pageWeb = new QWebView;

	QVBoxLayout* layout = new QVBoxLayout;
	layout->setContentsMargins(0, 0, 0, 0);
	layout->addWidget(pageWeb);
	pageOnglet->setLayout(layout);

	if(url.isEmpty())
	{
		pageWeb->load(QUrl(tr("www.google.fr")));
	}
	else
	{
		if(url.left(7) != "http://" && url.left(8) != "https://")
		{
			url = "http://"+url;
		}
		pageWeb->load(QUrl(url));
	}

	// Gestion signaux envoyés par la page web
	connect(pageWeb, SIGNAL(titleChanged(QString)), this, SLOT(changementTitre(QString)));
	connect(pageWeb, SIGNAL(urlChanged(QUrl)), this, SLOT(changementUrl(QUrl)));
	connect(pageWeb, SIGNAL(loadStarted()), this, SLOT(chargementDebut()));
	connect(pageWeb, SIGNAL(loadProgress(int)), this, SLOT(chargementEnCours(int)));
	connect(pageWeb, SIGNAL(loadFinished(bool)), this, SLOT(chargementTermine(bool)));

	return pageOnglet;
}

QWebView * MaXNav::pageActuelle()
{
	return _onglets->currentWidget()->findChild<QWebView *>();
}


void MaXNav::precedente()
{
	pageActuelle()->back();
}

void MaXNav::suivante()
{
	pageActuelle()->forward();
}

void MaXNav::accueil()
{
	pageActuelle()->load(QUrl(tr("http://www.google.fr")));
}

void MaXNav::stop()
{
	pageActuelle()->stop();
}

void MaXNav::actualiser()
{
	pageActuelle()->reload();
}

void MaXNav::aPropos()
{
	QMessageBox::information(this, tr("A propos..."), trUtf8("MaXNav est un projet réalisé par <a href='http://www.maxzone.fr'>Maxime Guinin</a> (étudiant à l'<a href='http://www.ensicaen.fr'>ENSICaen</a> pour prendre en main Qt"));
}

void MaXNav::nouvelOnglet()
{
	int indexNouvelOnglet = _onglets->addTab(creerOngletPageWeb(), tr("(Nouvelle Page)"));
	_onglets->setCurrentIndex(indexNouvelOnglet);
	_onglets->setTabText(_onglets->currentIndex(), tr("(Nouvelle Page)"));
	_adresse->setText(pageActuelle()->url().toString());
	_adresse->setFocus(Qt::OtherFocusReason);
	_onglets->cornerWidget(Qt::TopLeftCorner)->setVisible(true);
}

void MaXNav::fermerOnglet()
{
	if(_onglets->count() > 1)
	{
		_onglets->removeTab(_onglets->currentIndex());
		if(_onglets->count() <= 1)
		{
			_onglets->cornerWidget(Qt::TopLeftCorner)->setVisible(false);
		}
	}
	else
	{
		qApp->quit();
	}
}

void MaXNav::chargerPage()
{
	QString url = _adresse->text();

	if(url.left(7) != "http://" && url.left(8) != "https://")
	{
		url = "http://"+url;
		_adresse->setText(url);
	}
	pageActuelle()->load(QUrl(url));
}

void MaXNav::chargerRecherche()
{
	QString url = _recherche->text();
	url = "http://www.google.com/search?q="+url.replace(" ", "+");

	pageActuelle()->load(QUrl(url));
}

void MaXNav::effacerRecherche()
{
	_recherche->setText("");
}

void MaXNav::miseAJourRecherche(const QString& s)
{
	if(s.isEmpty())
	{
		_recherche->setStyleSheet(QString("QLineEdit { padding : 2px;} "));
	}
	else
	{
		_recherche->setStyleSheet(QString("QLineEdit { padding : 2px; padding-left: %1px; } ").arg(_clearButton->sizeHint().width()-5));
	}
	_clearButton->setVisible(!s.isEmpty());
}

void MaXNav::changementOnglet(int index)
{
	index = 0;
	changementTitre(pageActuelle()->title() == "" ? tr("(Nouvel Onglet)") : pageActuelle()->title());
	changementUrl(pageActuelle()->url());
}

void MaXNav::rechercherPage()
{
	if(!_toolBarCherchePage->isVisible())
	{
		_toolBarCherchePage->setVisible(true);
	}
	else
	{
		QWebPage::FindFlags mode;
		if(_respecterCasse->isChecked())
			mode = QWebPage::FindCaseSensitively | QWebPage::FindWrapsAroundDocument;
		else
			mode = QWebPage::FindWrapsAroundDocument;

		pageActuelle()->findText("", QWebPage::HighlightAllOccurrences);
		if(!pageActuelle()->findText(_recherchePage->text(), mode)
				&& _recherchePage->text() != "")
			_recherchePage->setStyleSheet("background : #BB4848");
		else
			_recherchePage->setStyleSheet("background : white");
	}
	_recherchePage->setFocus(Qt::OtherFocusReason);
}

void MaXNav::fermerRechercherPage()
{
	_toolBarCherchePage->setVisible(false);
}

void MaXNav::changementTitre(const QString & titreComplet)
{
	QString titreCourt = titreComplet;

	// Tronquer le titre si il est trop grand
	if(titreComplet.size() > 40)
	{
		titreCourt = titreComplet.left(40) + "...";
	}

	setWindowTitle(tr("MaXNav") + " - " + titreCourt);
	_onglets->setTabText(_onglets->currentIndex(), titreCourt);
}

void MaXNav::changementUrl(const QUrl & url)
{
	_adresse->setText(url.toString());
	_adresse->setCursorPosition(0);
	QWebHistory * history = pageActuelle()->history();
	if((history->backItem()).isValid())
		actionPrecedente->setEnabled(true);
	else
		actionPrecedente->setEnabled(false);

	if((history->forwardItem()).isValid())
		actionSuivante->setEnabled(true);
	else
		actionSuivante->setEnabled(false);
}

void MaXNav::chargementDebut()
{
	actionStop->setEnabled(true);
	_progression->setVisible(true);
}

void MaXNav::chargementEnCours(int pourcentage)
{
	_progression->setValue(pourcentage);
}

void MaXNav::chargementTermine(bool ok)
{
	actionStop->setEnabled(false);
	_progression->setVisible(ok ? false : false);
	statusBar()->showMessage(trUtf8("Prêt"), 2000);
}


MaXNav::~MaXNav()
{

}
